#ifndef _GAME_H_
#define _GAME_H_

#include "music.h"
#include "rtc.h"
#include "video-text.h"
#include "video-graphics.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/** @defgroup game Game
 * @{
 *
 * Functions related with the game
 */

/** @name Scancodes */
/*@{*/
#define ENTER 0x1c ///< Enter key
#define UP 0x48 ///< Up Arrow key
#define DOWN 0x50 ///< Down Arrow key
#define LEFT 0x4b ///< Left Arrow key
#define RIGHT 0x4d ///< Right Arrow key
#define ESC 0x01 ///< Escape key
#define END 0x4f ///< End key
#define DEL 0x53 ///< Delete key
#define PDOWN 0x51 ///< PageDown key
#define PUP 0x49 ///< PageUp key
#define HOME 0x47 ///< Home key
/*@}*/ 

#define MAX 100

extern int scancode;

/** @name Useful typedefs */
/*@{*/
typedef enum {DO,RE,MI,FA,SOL,LA,SI,DOs,Surrender,NoNotas} menu_notas;
typedef enum {None,Note1,Note2,Note3,Note4,Note5,Note6,Note7,Note8,Note9,Note10,Note11,Note12,Note13,Note14,Note15} user_notes;
typedef enum {HALF,ONE,TWO,BACK} menu_duration;
typedef char string[MAX];
/*@}*/

/** Desenha um menu e permite escolher a duracao da nota
 *
*/
Note choose_duration(menu_notas escolha, int edit);

/** Toca o sample da nota selecionado com determinada duracao
 *
*/
void play_n(menu_notas escolha, menu_duration esc_dur);

/** Devolve a nota selecionada pelo jogador
 *
*/
Note selected_note(menu_notas escolha, menu_duration esc_dur);

/** Declaracao da interrupcao do keyboard
 *
*/
void kbd_isr();

/** Funcao que limpa o ecra com a cor definida
 *
*/
void cleanscreen();

/** Funcao com o menu inicial do jogo, com a lista de notas a escolher, notas inseridas pelo utilizador que
 * recebe o nome do jogador e retorna a pontuacao por ele feita
*/
int start_game(char* player);

/** Funcao que desennha uma nota inserida pelo jogador
 *
*/
void drawNote(int x, int y, Note* nt, Bool select);

/** Funcao que toca o conjunto de notas inseridas pelo jogador
 *
*/
void play_user_song();

/** Funcao que toca a musica selecionada aleatoriamente pelo jogo
 *
*/
void play_game_song();

/** Funcao que apaga do array de notas a nota selecionado pelo jogador atraves da tecla DEL
 *
*/
void delete_user_note(user_notes esc_nota);

/** Funcao que escolhe aleatoriamente uma musica para o jogo
 *
*/
void random_song();

/** Funcao que entra no modo grafico e desenha o equalizador da musica do jogo e das notas ja
 * inseridas pelo utilizador
*/
int equalizer();

/** Retorna o numero de notas acertadas pelo jogador
 *
*/
int notas_correctas();

/** Verifica se o jogador acertou a musica toda
 *
*/
int comparar_musica();

/** Funcao que preenche os arrays com as listagens de pontos a desenhar no equalizador
 *
*/
void makepoints();

/** Funcao que le do ficheiro as melhores pontuacoes
 *
*/
int load(char ** nomes, int * pontos);

/** Funcao que grava no ficheiro as melhores pontuacoes
 *
*/
void save(char ** nomes, int * pontos, int num);

/** Funcao que acrescenta no local correcto a pontuacao do jogador
 *
*/
void add_highscore(int score, char* name);

/** @} end of game */

#endif
